package cn.demoncat.util.lang.entity.report;

import java.time.LocalDateTime;
import java.util.Map;

import cn.demoncat.util.lang.LocalDateUtil;
import cn.demoncat.util.lang.ObjectUtil;
import cn.demoncat.util.lang.ParamEmptyUtil;
import cn.demoncat.util.lang.constant.DateConstant;
import cn.demoncat.util.lang.entity.MapSo;
import cn.demoncat.util.mybatis.constant.MapperConstant;
import cn.demoncat.util.lang.constant.ReportConstant;

/**
 * 报表参数 - 保存报表（查询源表数据的参数、填充报表数据的参数）
 * 
 * @author 延晓磊
 *
 * @since 2019年12月11日
 */
public class ReportParamSave extends ReportTime {

	// 当前时间
	private LocalDateTime now;
	// 开始时间：上1个时间，startCreateTime <= time
	private LocalDateTime startTime;
	// 结束时间：这1个时间，endCreateTime > time
	private LocalDateTime endTime;

	// 统计时间
	private String date;
 
	/**
	 * 获取插入报表的参数：查询参数、填充参数
	 * 
	 * @param mode		模式：ReportConstant.Mode
	 * 
	 * @return {now, startTime <= [time] < endTime}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	public static ReportParamSave build(String mode) {
		return build(mode, null);
	}
	
	/**
	 * 获取插入报表的参数：查询参数、填充参数
	 * <br/><br/>
	 * 1、根据模式，格式化报表的查询起始时间、查询结束时间、存储时间
	 * 
	 * @param mode		模式：ReportConstant.Mode
	 * @param now		指定的当前时间
	 * 
	 * @return {now, startTime <= [time] < endTime}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	public static ReportParamSave build(String mode, LocalDateTime now) {
		// 参数校验
		ParamEmptyUtil.checkBlank(mode);
		// 当前时间
		ReportParamSave param = new ReportParamSave();
		param.setNow(ObjectUtil.toDefault(now, LocalDateTime.now()));
		// 模式（格式化查询的起止时间）
		switch (mode) {
		case ReportConstant.ModeTime.HOUR:
			// 时
			param.setEndTime(LocalDateUtil.startOfHour(param.getNow()));
			param.setStartTime(param.getEndTime().minusHours(1));
			break;
		case ReportConstant.ModeTime.DAY:
			// 日
			param.setEndTime(LocalDateUtil.startOfDay(param.getNow()));
			param.setStartTime(param.getEndTime().minusDays(1));
			break;
		case ReportConstant.ModeTime.MONTH:
			// 月
			param.setEndTime(LocalDateUtil.startOfMonth(param.getNow()));
			param.setStartTime(param.getEndTime().minusMonths(1));
			break;
		case ReportConstant.ModeTime.YEAR:
			// 年
			param.setEndTime(LocalDateUtil.startOfYear(param.getNow()));
			param.setStartTime(param.getEndTime().minusYears(1));
			break;
		case ReportConstant.ModeTime.WEEK:
			// 周
			param.setEndTime(LocalDateUtil.startOfWeek(param.getNow()));
			param.setStartTime(param.getEndTime().minusWeeks(1));
			break;
		default:
			throw ReportConstant.CHART_MODE_ERROR;
		}
		// 详细时间（报表的存储时间）
		param.setDate(param.getStartTime().format(DateConstant.DATE_TIME_FORMAT));
		param.setHour(param.getStartTime().getHour());
		param.setDay(param.getStartTime().getDayOfMonth());
		param.setMonth(param.getStartTime().getMonthValue());
		param.setYear(param.getStartTime().getYear());
		return param;
	}
	
	/**
	 * 获取时间区间查询参数
	 * 
	 * @return Map{startCreateTime,endCreateTime}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月13日
	 */
	public Map<String,Object> getParams(){
		return MapSo.getInstance(MapperConstant.ParamName.START_CREATE_TIME, this.getStartTime(), MapperConstant.ParamName.END_CREATE_TIME, this.getEndTime());
	}
	
	/**
	 * 获取时间区间查询参数
	 * 
	 * @return Map{startUpdateTime,endUpdateTime}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月13日
	 */
	public Map<String,Object> getParams2(){
		return MapSo.getInstance(MapperConstant.ParamName.START_UPDATE_TIME, this.getStartTime(), MapperConstant.ParamName.END_UPDATE_TIME, this.getEndTime());
	}
	
	/**
	 * 获取时间区间查询参数
	 * 
	 * @return Map{startTime,endTime}
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月13日
	 */
	public Map<String,Object> getParams3(){
		return MapSo.getInstance(MapperConstant.ParamName.START_TIME, this.getStartTime(), MapperConstant.ParamName.END_TIME, this.getEndTime());
	}
	
	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public LocalDateTime getNow() {
		return now;
	}

	public void setNow(LocalDateTime now) {
		this.now = now;
	}

	public LocalDateTime getStartTime() {
		return startTime;
	}

	public void setStartTime(LocalDateTime startTime) {
		this.startTime = startTime;
	}

	public LocalDateTime getEndTime() {
		return endTime;
	}

	public void setEndTime(LocalDateTime endTime) {
		this.endTime = endTime;
	}

}
